#pragma once

#include <compl.h>
/* 错误处理接口 */
// CEFF_FTYPE(void , merr_pinit_, ()) 
// CEFF_FTYPE(void , merr_tinit_, ())  
/* meta信息占用内存块大小 */
/* 改成异步?有必要吗 */
/* RETURN TRUE指返回能继续使用 */
typedef hword_t merr_t;

/* 没有错误 */
#define MERR_NO_ERR		((merr_t)0)
/* 内存用完(致命错误) */
#define MERR_NO_MEM		((merr_t)-1)
/* 头部被污染 */
#define MERR_CORRUPTED_HEAD	((merr_t)-2)
/* 尾部被污染 */
#define MERR_CORRUPTED_TAIL	((merr_t)-3)
/* 多次free */
#define MERR_DOUBLEFREE		((merr_t)-4)
/* meta被修改 */
#define MERR_WRONGMETA		((merr_t)-5)


// CEFF_FTYPE(bool_t, merr_raise_, (void *ptr, size_t size, merr_t errno))

// #define MERRH_CEFF(name)	merr_raise_##name
// #define MERRH_CEFF_ALL		MERRH_CEFF()

STA_OUFUN(merr_outf)
bool_t (* const merr_raise)(void *ptr, size_t size, merr_t errn);
END_OUFUN(merr_outf)

/* 不处理 */
SAI bool_t merr_raise_nothing(void *ptr, size_t size, merr_t errn){
	PARAM_USED(ptr, size, errn);
	return FALSE;
}
NEW_OUFUN(merr_outf, nothing, merr_raise_nothing)
/* 只输出错误，不处理 */
SAI bool_t merr_raise_output(void *ptr, size_t size, merr_t errn){
	ERRN("%p, sz %lu is corrupted, errno is %u\n", ptr, size, errn);
	return FALSE;
}
NEW_OUFUN(merr_outf, output, merr_raise_output)

